/* 

给定一个字符串数组，将字母异位词组合在一起。字母异位词指字母相同，但排列不同的字符串。

示例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]
说明：

所有输入均为小写字母。
不考虑答案输出的顺序。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/group-anagrams
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

*/

/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function (strs) {
    if (!strs.length) return [];

    let res = [];
    let map = new Map();

    for (let str of strs) {
        let characters = new Array(26).fill(0);
        for (let i = 0, len = str.length; i < len; i++) {
            let index = str.charCodeAt(i) - 97;
            characters[index]++;
        }
        //一定要用一个字符隔开，不用字符隔开会有歧义，例如 110 可以看成为 11 0 和 1 10
        let key = characters.join(" ");
        if (map.has(key)) {
            map.set(key, [...map.get(key), str]);
        } else {
            map.set(key, [str]);
        }
    }

    for (let [index, value] of map) {
        res.push(value);
    }

    return res;
};